﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using TicketsPhone.Web.Models;
using TicketsPhone.Domain.Entities;
using TicketsPhone.Domain.Access;
using TicketsPhone.Web.Utils;

namespace TicketsPhone.Web.Controllers
{
    public class TramitesController : BaseController, IConsultasSeccion<TramiteFormModel>
    {

        EntidadRepositorio _entidad = new EntidadRepositorio();
        TramiteRepositorio _tramite = new TramiteRepositorio();

        public TipoModulo ModuloActual
        {
            get { return TipoModulo.Tramites; }
        }

        public ActionResult Listar()
        {
            TramiteFormModel model = new TramiteFormModel();
            List<Tramite> lista = new List<Tramite>();

            _tramite.Objeto = new Tramite();

            if (!string.IsNullOrEmpty(Request.QueryString["buscador"]))
            {
                _tramite.Objeto.Nombre = Request.QueryString["buscador"];
            }

            model.CargarDatosPaginados(_tramite.Filtrar());

            return View(model);
        }

        public ActionResult Editar(int id)
        {
            TramiteFormModel model = new TramiteFormModel();
            model.Objeto = _tramite.Cargar(id);
            model.Entidades = _entidad.ObtenerTodos();

            if (model.Objeto.IdTramite.HasValue)
            {
                return View(model);
            }
            else
            {
                return RedirectToAction("Listar");
            }
        }

        [HttpPost]
        public ActionResult Editar(TramiteFormModel model, int id)
        {
            if (ModelState.IsValid)
            {
                GuardarTramite(model, id);
            }

            return View(model);
        }

        public ActionResult Crear()
        {
            TramiteFormModel model = new TramiteFormModel();
            model.Accion = TipoTransaccion.Crear;
            model.Entidades = _entidad.ObtenerTodos();
            return View(model);
        }

        [HttpPost]
        public ActionResult Crear(TramiteFormModel model)
        {
            if (ModelState.IsValid)
            {
                GuardarTramite(model, 0);
            }

            return View(model);
        }

        public ActionResult Eliminar(int id)
        {
            BaseModel model = new BaseModel();

            if (_tramite.Eliminar(id))
                model.Javascript = Scripts.RedireccionConMensaje("/Tramites/Listar", "Tramite eliminado correctamente");
            else
            {
                string mensaje = "El tramite no se pudo eliminar";

                if (_tramite.TipoError == TipoErrorSql.ReferenceConstraint)
                {
                    if (_tramite.Error.IndexOf("FK_TramiteSucursal_Tramite") > 0)
                    {
                        mensaje = "ERROR: El tramite tiene sucrusales asociadas.";
                    }
                }

                model.Javascript = Scripts.RedireccionConMensaje("/Tramites/Listar", mensaje);
            }

            return View(model);
        }

        #region Metodos
        private void GuardarTramite(TramiteFormModel model, int id)
        {
            _tramite.Objeto = model.Objeto;
            _tramite.Objeto.FechaModificacion = DateTime.Now;

            bool operacionExitosa = false;
            TipoTransaccion tipoTransaccion = TipoTransaccion.Editar;

            if (id == 0)
            {
                id = _tramite.Crear();
                _tramite.Objeto.IdTramite = id;
                operacionExitosa = id > 0;

                tipoTransaccion = TipoTransaccion.Crear;
            }
            else
            {
                _tramite.Objeto.IdTramite = id;
                operacionExitosa = _tramite.Editar();
            }

            if (operacionExitosa)
            {
                GuardarLogTransaccion(tipoTransaccion, model.Objeto);
                model.Javascript = Scripts.RedireccionConMensaje("/Tramites/Listar", "Tramite guardado correctamente");
            }
            else
            {
                model.Javascript = Scripts.Alert("La entidad no se pudo guardar");
            }
        }
        #endregion
    }
}
